Java JVM学习-堆的结构
堆的核心概述
一个 JVM 实例只存在一个堆内存,堆也是 Java内存管理的核心区域。

所有的线程共享 Java 堆,但是不能说堆的所有部分都是共享的,因为还有一个线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。
《Java虚拟机规范》中对 Java堆的描述是:几乎所有的对象实例以及数组都应当在运行时分配在堆上。(The heap is the run-time data area from which memory for almost class instances and arrays is allocated)但是随着 JIT 编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么 “绝对” 了。具体看下面逃逸分析那一节
数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置。

堆也是GC(Garbage Collection,垃圾收集器)执行垃圾回 收的重点区域。
在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。
- 也就是触发了 GC的时候,才会进行回收
- 如果堆中对象马上被回收,那么用户线程就会收到影响,因为有 stop the word
Java 堆区在 JVM启动的时候(Bootstrap 启动时)即被创建,其空间大小也就确定了。是 JVM管理的最大一块内存空间。《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。(就是虚拟内存的知识)
堆内存的大小是可以调节的。
-Xms10m:最小堆内存
-Xmx10m:最大堆内存
可以在 JDK 提供的 JVisualVM 工具看到分配的资源,以及使用情况,它位于 JDK 的 bin 目录下(注意版本)

第一次打开需要装个 VisualGC 插件,使之能看到 GC 情况
